package tbs.framework.utils

import tbs.framework.exceptions.IErrorConsumer
import tbs.framework.interfaces.FunctionWithThrows
import tbs.framework.log.ILogger
import tbs.framework.log.annotations.AutoLogger

/**
 * 一个用于安全运行包装器类，用于执行可能抛出异常的功能，并根据错误处理策略返回相应结果。
 *
 * @param R 返回值类型
 * @param P 参数类型
 * @param EI 错误消费者类型，实现自IErrorConsumer
 * @date 2024/9/21
 */
class SafelyRunningWrapper<R, P, EI : IErrorConsumer> : IWrapper<R, P, EI, Void, Throwable> {
    @AutoLogger
    private var logger: ILogger? = null;


    /**
     * 执行给定的功能，并根据错误消费者处理可能发生的异常。
     *
     * @param function 要执行的功能，可能抛出异常
     * @param param 功能的参数
     * @param arg1 错误消费者，用于处理异常
     * @param arg2 未使用，保留为Void类型的参数
     * @return 功能的执行结果，或者根据错误处理策略返回的错误结果
     */
    override fun wrap(
        function: FunctionWithThrows<P?, R?, Throwable?>,
        param: P?,
        arg1: EI?,
        arg2: Void?
    ): R? {
        try {
            return function.apply(param)
        } catch (e: Throwable) {
            if (arg1?.errorSupported(e) == true) {
                logger?.debug("error msg:{} in safely running wrapper {}", e.message, this);
                return arg1.onErrorReturn(e) as R?;
            }
        }
        return null;
    }

    /**
     * 安全地执行给定的功能，任何异常都会被捕获并记录，确保程序不会因为未捕获的异常而崩溃。
     *
     * @param function 要执行的功能，可能抛出异常
     * @param param 功能的参数
     * @param arg1 错误消费者，用于处理异常
     * @param arg2 未使用，保留为Void类型的参数
     * @return 功能的执行结果，或者在发生异常时返回null
     */
    override fun wrapSafely(
        function: FunctionWithThrows<P?, R?, Throwable?>,
        param: P?,
        arg1: EI?,
        arg2: Void?
    ): R? {
        try {
            return wrap(function, param, arg1, arg2)
        } catch (e: Throwable) {
            logger?.error(e, "{},badly running wrapper {}", e.message, this);
            return null
        }
    }

}
